home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / MM2SERIA.M < prev    next >
Encoding:
Text File  |  1994-04-05  |  10.1 KB  |  3 lines

  1. ⓪ MODULE MM2Serialize;⓪ ⓪ (*    =======================================⓪'Vertraulich! Keinesfalls weitergeben!⓪&=======================================⓪ ⓪&Seriennummern im Compiler eintragen⓪(⓪&17.11.87  jm   /0.0/  Suchen der Seriennummern⓪&15.12.87  jm   /1.0/  lauffähige Version⓪&29.02.88  jm   /1.1/  neues Schlüsselverfahren mit Offset⓪&??.??.89  TT   /1.2/  wählt beliebig viele Dateien mit Selektor aus⓪&08.03.90  TT   /1.3/  ForceMediaChange-Aufruf⓪=>>> Bringt aber nichts bei Cache-Prg, weil⓪Adas offenbar nichts davon mitbekommt⓪ *)⓪ ⓪ IMPORT GEMDOSIO; (*$E MOS*)⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER;⓪ ⓪ FROM Files   IMPORT File, Open, Create, Close, Remove, State,⓪4Access, ReplaceMode;⓪ FROM MOSGlobals IMPORT Drive;⓪ FROM FileNames IMPORT StrToDrive;⓪ FROM Directory IMPORT ForceMediaChange;⓪ FROM Binary  IMPORT SeekMode, Seek, ReadBytes, ReadWord, WriteWord, FileSize;⓪ FROM PathCtrl IMPORT PathList;⓪ FROM ShellMsg IMPORT StdPaths;⓪ FROM Paths   IMPORT SearchFile, ListPos;⓪ FROM InOut   IMPORT WriteString, WriteLn, Read, WriteCard, ReadCard, WriteHex,⓪4WritePg;⓪ FROM Storage IMPORT ALLOCATE, DEALLOCATE;⓪ FROM Strings IMPORT Concat;⓪ FROM StrConv IMPORT CardToStr;⓪ FROM SYSTEM  IMPORT ADDRESS;⓪ FROM PrgCtrl IMPORT TermProcess;⓪ ⓪ FROM GEMEnv   IMPORT RC, DeviceHandle, InitGem;⓪ FROM EasyGEM0 IMPORT HideMouse;⓪ FROM EasyGEM1 IMPORT SelectMask, SelectFile;⓪ ⓪ ⓪ ⓪ CONST     NrKeys = 2;                 (* Anzahl verschiedener Schlüssel *)⓪*NrMods = 2;                 (* Anzahl der Module mit Schlüsseln *)⓪(maxCount = 10;                (* max. Anzahl Referenzen pro Nummer *)⓪ ⓪ TYPE     PosList = ARRAY [1..maxCount] OF LONGCARD;⓪ ⓪ VAR⓪,value,                    (* Werte der Default-Seriennummern *)⓪-lead,                    (* LeadIn-Worte   -"-              *)⓪)expCount,                    (* erwartete Anzahl der Vorkommen  *)⓪,patch: ARRAY [0..NrKeys] OF CARDINAL;⓪*offsets: ARRAY [1..NrMods] OF ARRAY [0..NrKeys] OF PosList;⓪ ⓪-Offs,⓪+RegLen,⓪)FeedBack,⓪*Iterate: ARRAY [1..NrKeys] OF CARDINAL;⓪ ⓪)compname: ARRAY [1..NrMods] OF ARRAY [0..141] OF CHAR;⓪/ok: BOOLEAN;⓪ ⓪ ⓪ PROCEDURE err (s: ARRAY OF CHAR; fatal: BOOLEAN);⓪"VAR c: CHAR;⓪"BEGIN⓪$WriteLn; WriteString ('>> '); WriteString (s); WriteLn;⓪$IF fatal THEN⓪&Read (c); TermProcess (1);⓪$END⓪"END err;⓪"⓪ ⓪ PROCEDURE ReadCompiler (VAR a: ADDRESS; VAR size: LONGCARD;⓪9name: ARRAY OF CHAR): BOOLEAN;⓪"⓪"(* Sucht Datei <name> auf DefaultPath,⓪%reserviert Speicher und liest Datei ein.⓪%<a>    := Anfangsadresse der Datei im Speicher;⓪%<size> := Länge  -"- .⓪%Ergebnis := 'Datei gefunden, genug Platz zum Einlesen gehabt'⓪"*)⓪"⓪"VAR         f: File;⓪+read: LONGCARD;⓪ ⓪"BEGIN⓪$Open (f, name, readOnly);⓪$size := FileSize (f);⓪$ALLOCATE (a, size);⓪$IF a = NIL THEN RETURN FALSE END;⓪$ReadBytes (f, a, size, read);⓪$IF size # read THEN RETURN FALSE END;⓪$Close (f);⓪$RETURN TRUE⓪"END ReadCompiler;⓪ ⓪ ⓪ PROCEDURE Search (        a: ADDRESS; len: LONGCARD; targ1, targ2: CARDINAL;⓪2VAR count: CARDINAL;⓪4VAR pos: PosList);⓪"BEGIN⓪$ASSEMBLER⓪&MOVE.L   pos(A6),A1⓪&CLR.W    D3⓪&MOVE.L   a(A6),A0⓪&MOVE.L   len(A6),D1⓪&MOVE.W   targ1(A6),D0⓪&MOVE.W   targ2(A6),D4⓪#⓪#lp CMP.W    (A0)+,D0         ;Suchschleife⓪&BNE      nix⓪&CMP.W    (A0),D4⓪&BNE      nix⓪&MOVE.L   A0,D2⓪&SUB.L    a(A6),D2⓪&MOVE.L   D2,(A1)+⓪&ADDQ.L   #1,D3⓪"nix SUBQ.L   #2,D1⓪&BHI      lp⓪&⓪&MOVE.L   count(A6),A0⓪&MOVE.W   D3,(A0)          ;setze Count⓪$END⓪"END Search;⓪ ⓪ ⓪ PROCEDURE FindOffsets;⓪"⓪"(*  Liest alle Dateien <compname>.⓪&Durchsucht sie nach Auftreten von <lead>, <value> und prüft⓪&jeweils, ob <expcount> Vorkommen gefunden. Wenn gefunden, wird⓪&der jew. Offset im entspr. File in 'offsets' vermerkt.⓪&Bricht im Fehlerfall mit Meldung ab.⓪"*)⓪&⓪"VAR          a: ARRAY [1..NrMods] OF ADDRESS;⓪/l: ARRAY [1..NrMods] OF LONGCARD;⓪.wl: LONGCARD;⓪-ofs: PosList;⓪"count, n, i, k: CARDINAL;⓪*errmsg: ARRAY [0..127] OF CHAR;⓪+dummy: BOOLEAN;⓪"⓪"BEGIN⓪$wl:= 0;⓪$FOR n:= 1 TO NrMods DO⓪&IF NOT ReadCompiler (a [n], l [n], compname [n]) THEN⓪(err ('Compiler kann nicht gelesen werden!', TRUE)⓪&END;⓪&INC (wl, l [n]);⓪&FOR k:= 0 TO NrKeys DO⓪(FOR i:= 1 TO expCount [k] DO offsets [n, k, i]:= 0 END⓪&END;⓪$END;⓪$FOR k:= 0 TO NrKeys DO⓪&Search (a [1], wl, lead [k], value [k], count, ofs);⓪&IF count # expCount [k] THEN⓪(Concat ('Falsche Anzahl Schlüsseleinträge: ',⓪1CardToStr (count, 0), errmsg, dummy);⓪(err (errmsg, TRUE)⓪&END;⓪&FOR i:= 1 TO expCount [k] DO⓪(FOR n:= 1 TO NrMods DO⓪*IF (ofs[i] >= a[n] - a[1]) & (ofs[i] < a[n] - a[1] + l[n]) THEN⓪,offsets [n, k, i]:= ofs[i] - (a[n] - a[1])⓪*END⓪(END⓪&END⓪$END;⓪$count:= 0;⓪$FOR n:= 1 TO NrMods DO⓪&FOR k:= 0 TO NrKeys DO⓪(FOR i:= 1 TO expCount [k] DO⓪*IF offsets [n, k, i] = 0L THEN INC (count) END;⓪(END⓪&END;⓪&DEALLOCATE (a [n], l [n]);⓪$END;⓪$n:= 0;⓪$FOR k:= 0 TO NrKeys DO⓪&INC (n, expCount [k])⓪$END;⓪$IF count # n THEN⓪&err ('Interner Fehler: Schlüsselanzahl falsch.', TRUE)⓪$END⓪"END FindOffsets;⓪"⓪"⓪ PROCEDURE encode (start, len, feedback, iter, off: CARDINAL): CARDINAL; (*$L-*)⓪$⓪"(* Schieberegister rechtsrum, Bits 0..<len>,⓪%Rückkopplung aus Bit <feedback>, auf <start>-Wert loslassen.⓪%<iter> Iterationen durchführen; <Off> addieren;⓪%Ergebnis auf Cardinal kürzen⓪"*)⓪"⓪"BEGIN⓪$ASSEMBLER⓪&MOVE.W  -(A3),D3        ;Offset⓪&MOVE.W  -(A3),D2        ;Iterationen⓪&MOVE.W  -(A3),D0        ;rückgeführtes Bit⓪&MOVE.W  -(A3),D4        ;Registerlänge -1⓪&CLR.L   D1⓪&MOVE.W  -(A3),D1        ;Startwert⓪&BRA     l1⓪#l2 BTST    D0,D1           ;Bit0 := Bit0 EOR Bit(D0)⓪&BEQ     nochg           ; "⓪&BCHG    #0,D1           ; "⓪ nochg LSR.L   #1,D1           ;einmal rechts schieben⓪&BCC     l1              ;und Bit0 in Bit(D4) rotieren⓪&BSET    D4,D1⓪#l1 DBF     D2,l2⓪&ADD.W   D3,D1           ;Offset dazu⓪&MOVE.W  D1,(A3)+        ;Ergebnis zurück⓪$END⓪"END encode;         (*$L+*)⓪"⓪"⓪ PROCEDURE CheckSer;⓪!⓪#(* prüft, ob die angegebenen Schlüsselverfahren konsistent⓪&sind mit den angegebenen Default-Einträgen.⓪&Im Fehlerfall Abbruch mit Meldung.⓪#*)⓪#⓪#VAR  k: CARDINAL;⓪#⓪#BEGIN⓪%FOR k := 1 TO NrKeys DO⓪'IF encode (value[0], RegLen[k], FeedBack[k], Iterate[k], Offs[k])⓪*# value [k]⓪)THEN err ('Schlüsselverfahren paßt nicht zu Default-Einträgen', TRUE)⓪'END⓪%END⓪#END CheckSer;⓪#⓪ ⓪ PROCEDURE CalcSer (mySer: CARDINAL);⓪"⓪"(* Übergabe der Seriennummer in <mySer>.⓪%Setzt ARRAY <patch> auf verschlüsselte Seriennummern.⓪%Verwendet Beschreibung der Schlüsselverfahren in⓪%<RegLen>, <FeedBack>, <Iterate>.           *)⓪"⓪"VAR  k: CARDINAL;⓪"⓪"BEGIN⓪$patch [0] := mySer;⓪$WriteString ('   Schlüssel'); WriteHex (patch [0], 7);⓪$FOR k := 1 TO NrKeys DO⓪&patch [k] :=⓪-encode (mySer, RegLen[k], FeedBack[k], Iterate[k], Offs [k]);⓪&WriteHex (patch[k], 7);⓪$END;⓪$WriteLn;⓪"END CalcSer;⓪"⓪"⓪ PROCEDURE OpenFile (VAR f: File; name: ARRAY OF CHAR): BOOLEAN;⓪"⓪"(* reserviert Speicher und liest Datei ein.⓪%<a>    := Anfangsadresse der Datei im Speicher;⓪%<size> := Länge  -"- .⓪%Ergebnis := 'Datei gefunden, genug Platz zum Einlesen gehabt'⓪"*)⓪ ⓪"BEGIN⓪$Open (f, name, readWrite);⓪$IF State (f) < 0 THEN⓪&err ('Datei nicht gefunden', FALSE); RETURN FALSE⓪$END;⓪$RETURN TRUE⓪"END OpenFile;⓪ ⓪ ⓪ PROCEDURE PatchSerial (mySer: CARDINAL): BOOLEAN;⓪"⓪"VAR  j, k, n: CARDINAL;⓪*f: File;⓪*w: CARDINAL;⓪*⓪"BEGIN⓪$CalcSer (mySer);⓪$FOR n:= 1 TO NrMods DO⓪&IF NOT OpenFile (f, compname [n]) THEN⓪(RETURN FALSE⓪&END;⓪&FOR j:= 0 TO NrKeys DO⓪(FOR k:= 1 TO expCount [j] DO⓪*IF offsets [n, j, k] # 0L THEN⓪,Seek (f, offsets [n, j, k], fromBegin);⓪,ReadWord (f, w);⓪,IF w # value [j] THEN⓪.IF (j=0) & (k=1) THEN⓪0err ('Falsche Seriennummern gefunden: Datei unverändert', FALSE);⓪0Close (f);⓪.ELSE⓪0err ('Falsche Seriennummern gefunden: Datei gelöscht', FALSE);⓪0Remove (f);⓪.END;⓪.RETURN FALSE⓪,END;⓪,Seek (f, -2L, fromPos);⓪,WriteWord (f, patch [j])⓪*END⓪(END⓪&END;⓪&Close (f);⓪$END;⓪$RETURN TRUE⓪"END PatchSerial;⓪"⓪"⓪ VAR   n, mySer: CARDINAL;⓪-c: CHAR;⓪,dh: DeviceHandle;⓪ ⓪ BEGIN⓪"⓪"InitGem (RC, dh, ok);⓪"⓪"HideMouse;⓪"WritePg;⓪"⓪"(* Konstanten für Schlüssel *)⓪"⓪"RegLen [1] := 17; FeedBack [1] := 7; Iterate [1] :=  39; Offs [1] := $2302;⓪"RegLen [2] := 16; FeedBack [2] := 3; Iterate [2] := 367; Offs [2] := $3C78;⓪#⓪"(* Default-Seriennummern im Compiler *)⓪"⓪"value [0] := $4711;  expCount [0] := 3;  lead [0] := $0641;⓪"value [1] := $1ADE;  expCount [1] := 1;  lead [1] := $343C;⓪"value [2] := $312F;  expCount [2] := 1;  lead [2] := $0240;⓪"⓪"(* Seriennummern im Compiler suchen *)⓪"⓪"WriteString ('Serialize /1.3/:  Seriennummern in Compiler eintragen ');⓪"WriteLn; WriteLn;⓪"⓪"(*⓪"WriteString ('Achtung: Bei TOS 1.4ff kein Cache-Prg verwenden!');⓪"WriteLn; WriteLn;⓪"*)⓪"⓪"WriteString ('Konsistenzprüfung der angegebenen Schlüssel:'); WriteLn;⓪"CheckSer;⓪"WriteString ('   ok.'); WriteLn; WriteLn;⓪"⓪"FOR n:= 1 TO NrMods DO⓪$SelectFile ('Wo isser?', compname [n], ok);⓪$IF NOT ok THEN RETURN END;⓪$WritePg;⓪"END;⓪"⓪"WriteString ('Suchen der Seriennummern:'); WriteLn;⓪"⓪"FindOffsets;⓪"WriteString ('   ok.'); WriteLn; WriteLn;⓪"⓪"(* neue Seriennummern eintragen *)⓪"⓪"LOOP⓪$WriteString ('Neue Seriennummer eintragen:'); WriteLn;⓪$WriteString ('   Nummer eingeben (0 stoppt): ');⓪$ReadCard (mySer);⓪$IF mySer = 0 THEN EXIT END;⓪$⓪$ForceMediaChange (StrToDrive (compname[1]));⓪$IF PatchSerial (mySer) THEN⓪&WriteString ('   ok.'); WriteLn;⓪$END;⓪$WriteLn;⓪"END;⓪"⓪ END MM2Serialize.⓪ ə
  2. (* $FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$000022E2$FFEDDD92$000025CB$FFEDDD92$00000C2C$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92ü$000022E2T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00000275$00000268$00000272$0000024F$0000023D$00002285$000022E2$00000396$FFD6B137$FFD6B137$000003AA$000003CF$000003B9$000003CB$000003E3$00000C2C£Çé*)
  3.